﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Biblioteca.Acceso_a_Datos.Data_Mappers;
using Biblioteca.Logica_Negocio.Domain_Model;
using PresentacionBiblioWeb.Models;
using WebMatrix.WebData;

namespace PresentacionBiblioWeb.Controllers
{
    public class MaterialesController : Controller
    {
        private BibliotecaContext db;
        private RepoGenerico<Material> repo;
        private RepoGenerico<CuentaSocio> repocuentasocio;
        private RepoGenerico<Reserva> reporeserva;
        private RepoGenerico<Socio> reposocios;
        private RepoGenerico<Prestamo> repoprestamo;


        public MaterialesController()
        {
            this.db = new BibliotecaContext();
            this.repo = new RepoGenerico<Material>(db);
            this.reposocios = new RepoGenerico<Socio>(db);
            this.repocuentasocio = new RepoGenerico<CuentaSocio>(db);
            this.reporeserva = new RepoGenerico<Reserva>(db);
            this.repoprestamo = new RepoGenerico<Prestamo>(db);
        }

       
        //
        // GET: /Materiales/
        [Authorize(Roles = "Administrador")]
        public ActionResult Index(string codigo, string titulo, string tema, string autor)
        {
            IEnumerable<Material> Materiales = this.repo.Todos();

            if (!string.IsNullOrEmpty(titulo))
            {
                Materiales = Materiales.Where(c => c.Titulo.ToLower().Contains(titulo));
            }
            if (!string.IsNullOrEmpty(tema))
            {
                Materiales = Materiales.Where(c => c.TemasString.ToLower().Contains(tema));
            }
            if (!string.IsNullOrEmpty(autor))
            {
                Materiales = Materiales.Where(c => c.AutoresString.ToLower().Contains(autor));
            }
            if (!string.IsNullOrEmpty(codigo))
            {
                Materiales = Materiales.Where(c => c.Codigo.ToString().ToLower().Contains(codigo));
            }

            return View(Materiales);
        }

        //
        // GET: /Materiales/Details/5
        [Authorize(Roles = "Administrador")]
        public ActionResult Details(int id = 0)
        {
            Material material = this.repo.Buscar(id);
            if (material == null)
            {
                return HttpNotFound();
            }
            return View(material);
        }

        //
        // GET: /Materiales/Create
        [Authorize(Roles = "Administrador")]
        public ActionResult Create()
        {
            ViewData["Tipos"] = new RepoGenerico<TipoMaterial>(this.db).Todos();
            ViewData["Autores"] = new RepoGenerico<Autor>(this.db).Todos();
            ViewData["Temas"] = new RepoGenerico<Tema>(this.db).Todos();
            ViewData["Editoriales"] = new RepoGenerico<Editorial>(this.db).Todos();
            return View();
        }

        //
        // POST: /Materiales/Create
        [HttpPost]
        [Authorize(Roles = "Administrador")]
        public ActionResult Create(Material material)
        {
            if (ModelState.IsValid)
            {
                //this.repo.Agregar(material);
                return RedirectToAction("Index");
            }

            return View(material);
        }

        //
        // GET: /Materiales/Edit/5
        [Authorize(Roles = "Administrador")]
        public ActionResult Edit(int id = 0)
        {
            Material material = this.repo.Buscar(id);
            if (material == null)
            {
                return HttpNotFound();
            }
            return View(material);
        }

        //
        // POST: /Materiales/Edit/5
        [Authorize(Roles = "Administrador")]
        [HttpPost]
        public ActionResult Edit(Material material)
        {
            if (ModelState.IsValid)
            {
                //this.repo.Modificar(material);
                return RedirectToAction("Index");
            }
            return View(material);
        }

        //
        // GET: /Materiales/Delete/5
        [Authorize(Roles = "Administrador")]
        public ActionResult Delete(int id = 0)
        {
            Material material = this.repo.Buscar(id);
            if (material == null)
            {
                return HttpNotFound();
            }
            return View(material);
        }

        //
        // POST: /Materiales/Delete/5
        [Authorize(Roles = "Administrador")]
        [HttpPost, ActionName("Delete")]
        public ActionResult DeleteConfirmed(int id)
        {
            Material material = this.repo.Buscar(id);
            //this.repo.Eliminar(material);
            return RedirectToAction("Index");
        }

        [Authorize(Roles = "Administrador")]
        protected override void Dispose(bool disposing)
        {
            this.repo.Dispose();
            base.Dispose(disposing);
        }

        //
        // GET: /Materiales/
        public ActionResult ListaMateriales(string codigo, string titulo, string tema, string autor)
        {
            IEnumerable<Material> Materiales = this.repo.Todos();

            if (!string.IsNullOrEmpty(titulo))
            {
                Materiales = Materiales.Where(c => c.Titulo.ToLower().Contains(titulo));
            }
            if (!string.IsNullOrEmpty(tema))
            {
                Materiales = Materiales.Where(c => c.TemasString.ToLower().Contains(tema));
            }
            if (!string.IsNullOrEmpty(autor))
            {
                Materiales = Materiales.Where(c => c.AutoresString.ToLower().Contains(autor));
            }
            if (!string.IsNullOrEmpty(codigo))
            {
                Materiales = Materiales.Where(c => c.Codigo.ToString().ToLower().Contains(codigo));
            }

            return View(Materiales);
        }

        //
        // GET: /Materiales/
        [Authorize(Roles = "Socio")]
        public ActionResult Reservar(int id)
        {
            ReservaVM r = new ReservaVM();
            int idsocio = repocuentasocio.EncontrarPrimeroSegun(x => x.UserName.Equals(User.Identity.Name)).SocioId;
            r.MaterialId = id;
            r.SocioId = idsocio;
            return View(r);
        }


        [HttpPost]
        [Authorize(Roles = "Socio")]
        public ActionResult Reservar(ReservaVM model)
        {
            if (ModelState.IsValid)
            {
                IEnumerable<Reserva> reservas = this.reporeserva.Todos().Where(x => ((x.Socio.Id == model.SocioId) && (x.EstaPendiente())));
                IEnumerable<Prestamo> prestamos = this.repoprestamo.Todos().Where(x => ((x.Socio.Id == model.SocioId) && ((x.EstaPendiente())||(x.EstaDespachado()))));
                if ((reservas.Count() + prestamos.Count()) < 5)
                {
                    Material mat = this.repo.Buscar(model.MaterialId);
                    Socio soc = this.reposocios.Buscar(model.SocioId);
                    //si hay un ejemplar disponible creo un prestamo
                    if (mat.HayDisponible())
                        mat.CrearPrestamo(soc, model.CantDias);
                    else
                        //si no hay ejemplar se crea una reserva
                        mat.CrearReserva(soc, model.CantDias);

                    this.db.SaveChanges();
                }
                else
                { 
                    //Mostrar mensaje que tiene ya 5 reservas activas
                }
           
                return RedirectToAction("ListaMateriales");
            }
            return View(model);
        }

        //
        // GET: /Materiales/Detalles
        public ActionResult DetallesUsuario(int id = 0)
        {
            Material material = this.repo.Buscar(id);
            if (material == null)
            {
                return HttpNotFound();
            }
            return View(material);
        }
    }
}